package polymorphism_0914;
/**
 * Animal animal =new Dog()
 * Animal animal =new Cat()
 *父类名称 父类引用=new 子类实例()
 * 对象天然的向上转型，不看前面父类，就看new在哪，且看调用方法有没有被重写，如果被重写了，调用的一定是被重写的子类方法
 * 对象向上转型发生在三个位置：
 * 1.直接赋值
 * 父类名称 父类引用=new 子类实例()
 * 2.方法传参
 *   Dog dog=new Dog("小狗",5);
 *   Cat cat=new Cat("小猫",3);
 *         fun(dog);
 *         fun(cat);
 * 3.方法的返回值
 *  return new Dog("汪汪",1);
 *  对象向上转型的优点：
 *  1.参数统一化，假设现在要求大家实现一个方法，可以接受所有父类及子类的对象
 *  2.向上转型可以方便子类的扩展(见ShapeTest类)
 */
public class Test {
    public static void main(String[] args) {
        Dog dog=new Dog("小狗",5);
        Cat cat=new Cat("小猫",3);
        fun(dog);
        fun(cat);
    }
    //方法形参是Animal父类的引用，但根据传入的具体子类不同，表现出来的eat方法就不同
    public static void fun(Animal animal){
        animal.eat();
    }
    public static Animal butAnimal(String animalName){
        if(animalName.equals("小狗")){
            return new Dog("汪汪",1);
        }
        else if(animalName.equals("小猫")){
            return new Cat("喵喵",1);
        }
        else{
            System.out.println("本店没有该类型的动物出售");
            return null;
        }
    }
}
